package br.com.beyondclick.model.entity;

import java.io.Serializable;
import java.math.BigDecimal;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Transient;

/**
 * @author acdesouza
 */
@Entity
public class CompraPedidoMaterial implements Comparable<CompraPedidoMaterial>, Serializable {
	private static final long serialVersionUID = 1L;

	@SuppressWarnings("unused")
	@Id @GeneratedValue
	private Long id;
	@ManyToOne() private CompraMaterial compraMaterial;
	@ManyToOne() private PedidoMaterial pedidoMaterial;

	private long quantidade;

	@Transient
	private BigDecimal valorTotalCompra;
	
	@Transient
	private BigDecimal valorTotalVenda;

	/**
	 * Usado pelo Stripes
	 */
	public CompraPedidoMaterial() {	}

	/**
	 * @param compraMaterial
	 * @param pedidoMaterial
	 * @param quantidade
	 */
	public CompraPedidoMaterial(CompraMaterial compraMaterial, PedidoMaterial pedidoMaterial, long quantidade) {
		this.compraMaterial = compraMaterial;
		this.pedidoMaterial = pedidoMaterial;
		this.quantidade = quantidade;
	}
	
	public int compareTo(CompraPedidoMaterial o) {
		if(this.pedidoMaterial.getPedido().getOrgao().getNome().equals(o.pedidoMaterial.getPedido().getOrgao().getNome())){
			if(this.compraMaterial.getCompra().getFornecedor().equals(o.compraMaterial.getCompra().getFornecedor())){
				return this.pedidoMaterial.getMaterial().getNome().compareTo(o.pedidoMaterial.getMaterial().getNome());
			}else{
				return this.compraMaterial.getCompra().getFornecedor().compareTo(o.compraMaterial.getCompra().getFornecedor());
			}
		}else{
			return this.pedidoMaterial.getPedido().getOrgao().getNome().compareTo(o.pedidoMaterial.getPedido().getOrgao().getNome());
		}
	}

	/**
	 * Calcular o pre�o total desta compra de material. O valo � obtido multiplicando o preco, unit�rio, de compra pela quantidade comprada.
	 * 
	 * @return Pre�o total desta compra de material
	 */
	public BigDecimal getPrecoTotalCompra(){
		this.valorTotalCompra = this.compraMaterial.getPreco().multiply(BigDecimal.valueOf(this.quantidade));
		return valorTotalCompra;
	}

	public BigDecimal getPrecoTotalVenda(){
		this.valorTotalVenda =  this.pedidoMaterial.getPrecoVenda().multiply(BigDecimal.valueOf(this.quantidade));
		return valorTotalVenda;
	}

	public BigDecimal getLucro(){
		return valorTotalVenda.subtract(valorTotalCompra);
	}

	public double getComissaoVendedor(){
		try{
			return valorTotalVenda.doubleValue() * this.pedidoMaterial.getPedido().getPercentual() / 100;
		}catch(NullPointerException e){
			return 0;
		}
	}

	/**
	 * @return the compraMaterial
	 */
	public CompraMaterial getCompraMaterial() {
		return compraMaterial;
	}

	/**
	 * @param compraMaterial the compraMaterial to set
	 */
	public void setCompraMaterial(CompraMaterial compraMaterial) {
		this.compraMaterial = compraMaterial;
	}

	/**
	 * @return the pedidoMaterial
	 */
	public PedidoMaterial getPedidoMaterial() {
		return pedidoMaterial;
	}

	/**
	 * @param pedidoMaterial the pedidoMaterial to set
	 */
	public void setPedidoMaterial(PedidoMaterial pedidoMaterial) {
		this.pedidoMaterial = pedidoMaterial;
	}

	/**
	 * @return the quantidade
	 */
	public long getQuantidade() {
		return quantidade;
	}

	/**
	 * @param quantidade the quantidade to set
	 */
	public void setQuantidade(long quantidade) {
		this.quantidade = quantidade;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int PRIME = 31;
		int result = 1;
		result = PRIME * result + ((compraMaterial == null) ? 0 : compraMaterial.hashCode());
		result = PRIME * result + ((pedidoMaterial == null) ? 0 : pedidoMaterial.hashCode());
		return result;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final CompraPedidoMaterial other = (CompraPedidoMaterial) obj;
		if (compraMaterial == null) {
			if (other.compraMaterial != null)
				return false;
		} else if (!compraMaterial.equals(other.compraMaterial))
			return false;
		if (pedidoMaterial == null) {
			if (other.pedidoMaterial != null)
				return false;
		} else if (!pedidoMaterial.equals(other.pedidoMaterial))
			return false;
		return true;
	}

}